from PIL import Image
import fitz  # PyMuPDF

def convert_pdf_to_single_image(pdf_path: str, output_image_path: str, dpi: int = 300) -> None:
    """
    将多页 PDF 转换为一张完整的图片。

    Args:
        pdf_path (str): PDF 文件的路径。
        output_image_path (str): 输出图片文件的路径 (例如: 'output.png' 或 'output.jpg')。
        dpi (int): 渲染 PDF 页面的 DPI（每英寸点数）。更高的 DPI 会生成更清晰的图片，但文件大小更大。
    """
    try:
        doc = fitz.open(pdf_path)
    except fitz.FileNotFoundError:
        print(f"错误: PDF 文件未找到 - {pdf_path}")
        return
    except Exception as e:
        print(f"打开 PDF 文件时发生错误: {e}")
        return

    images = []
    total_height = 0
    max_width = 0

    print(f"正在处理 {doc.page_count} 页 PDF...")

    for page_num in range(doc.page_count):
        page = doc.load_page(page_num)  # 加载每一页
        # 获取页面尺寸 (以点为单位)
        # page.rect 是一个 Rect 对象，其 width 和 height 属性是页面的尺寸
        page_width_pts = page.rect.width
        page_height_pts = page.rect.height

        # 计算渲染后的图像尺寸
        # image_width = int(page_width_pts * dpi / 72)
        # image_height = int(page_height_pts * dpi / 72)

        # PyMuPDF 的 get_pixmap 已经考虑了 dpi，直接获取 Pixmap
        pix = page.get_pixmap(matrix=fitz.Matrix(dpi / 72, dpi / 72)) # 72是PDF的默认DPI
        img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

        images.append(img)
        total_height += img.height
        if img.width > max_width:
            max_width = img.width

    doc.close()

    if not images:
        print("警告: 未能从 PDF 中提取任何图片。")
        return

    # 创建一个空白的最终图片，其宽度为最大页宽，高度为所有页高的总和
    final_image = Image.new('RGB', (max_width, total_height), (255, 255, 255)) # 白色背景

    y_offset = 0
    for img in images:
        # 将每页的图片粘贴到最终图片上
        # 如果页面宽度不同，我们将其居中或者靠左对齐，这里选择靠左对齐
        final_image.paste(img, (0, y_offset))
        y_offset += img.height

    try:
        final_image.save(output_image_path)
        print(f"PDF 已成功转换为单张图片并保存至: {output_image_path}")
    except Exception as e:
        print(f"保存图片时发生错误: {e}")

# 示例用法：
if __name__ == "__main__":
    # 确保你有一个名为 'example.pdf' 的多页 PDF 文件在同一目录下
    # 或者提供一个完整的路径
    pdf_file = 'settlement_pdfs/结算单_北京四季酒店_20250606091223.pdf'  # 替换为你的 PDF 文件路径
    output_image = 'imgs/output_bill.png' # 输出图片路径，可以是 .jpg, .png 等
    convert_pdf_to_single_image(pdf_file, output_image, dpi=300)
   